--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
docs/agents/module-ownership.md 37edfa4cfe5aa2f6ebb7e4aeac2e2c67ad181a52 (37edfa4c) Text, 11.44 KB
Tc9d1d9# Module ownership map
Domain ownership for MeshChatX. Use this when deciding where code and tests live.
Orchestration entry remains Ta5d6ff`meshchatx.meshchat` (Ta5d6ff`ReticulumMeshChat`, Ta5d6ff`main`).
Schema contracts live under Ta5d6ff`tests/backend/` (not production route modules).
Tc9d1d9## Backend
| Domain | Manager modules | HTTP route module | WS module | Primary tests | Frontend page |
| ----------------- | ------------------------------------------------------------- | ------------------------------------------- | ---------------------------- | ------------------------------------------------------------------------------------------ | ----------------------------------------------------- |
| Identity | Ta5d6ff`identity_context.py`, Ta5d6ff`identity_manager.py` | Ta5d6ff`http/routes/identities.py` | Ta5d6ff`http/ws/dispatch.py` | Ta5d6ff`test_identity_*`, identity-switch skills | Identities / tutorial |
| Status / startup | Ta5d6ff`lifecycle/deferred_network.py`, Ta5d6ff`rns_startup_recovery.py` | Ta5d6ff`http/routes/status.py` | (status via REST) | Ta5d6ff`test_deferred_network_startup.py`, Ta5d6ff`test_api_json_contracts.py` | App shell banners |
| Auth / CSRF | Ta5d6ff`csrf.py`, Ta5d6ff`app_security_settings.py`, Ta5d6ff`ip_allowlist.py` | Ta5d6ff`http/routes/auth.py` | Ta5d6ff`http/ws/dispatch.py` | Ta5d6ff`test_csrf*`, Ta5d6ff`test_access_attempts_*` | Auth gate in Ta5d6ff`App.vue` |
| Messages / LXMF | Ta5d6ff`message_handler.py`, Ta5d6ff`lxmf_utils.py`, Ta5d6ff`database/messages.py` | Ta5d6ff`http/routes/messages.py`, Ta5d6ff`lxmf.py` | Ta5d6ff`http/ws/dispatch.py` | LXMF messaging skill tests | Ta5d6ff`messages/MessagesPage.vue`, Ta5d6ff`ConversationViewer.vue` |
| Telephone / LXST | Ta5d6ff`telephone_manager.py`, Ta5d6ff`database/telephone.py` | Ta5d6ff`http/routes/telephone.py`, Ta5d6ff`contacts.py` | Ta5d6ff`http/ws/dispatch.py` | telephone contract tests | Ta5d6ff`call/CallPage.vue` |
| RRC | Ta5d6ff`rrc/manager.py`, Ta5d6ff`rrc/server.py` | Ta5d6ff`http/routes/rrc.py` | Ta5d6ff`http/ws/dispatch.py` | RRC skill tests | Ta5d6ff`relay/RelayChatPage.vue` |
| Map | Ta5d6ff`map_manager.py`, Ta5d6ff`map_overlay_manager.py` | Ta5d6ff`http/routes/map.py` | marker updates via broadcast | map manager tests | Ta5d6ff`map/MapPage.vue` |
| Plugins | Ta5d6ff`plugin_manager.py`, Ta5d6ff`plugin_permissions.py` | Ta5d6ff`http/routes/plugins.py`, Ta5d6ff`sideband.py` | Ta5d6ff`http/ws/dispatch.py` | plugin install security tests | Ta5d6ff`settings/PluginsSettingsSection.vue` |
| FileSync | Ta5d6ff`rns_filesync_handler.py` | Ta5d6ff`http/routes/filesync.py` | (REST-heavy) | filesync security tests | Ta5d6ff`filesync/` pages |
| Interfaces | Ta5d6ff`interface_editor.py`, Ta5d6ff`interface_config_parser.py` | Ta5d6ff`http/routes/interfaces.py` | (announce loops on app) | interface stats tests | Ta5d6ff`interfaces/InterfacesPage.vue` |
| Database / backup | Ta5d6ff`database/*`, Ta5d6ff`recovery/*` | Ta5d6ff`http/routes/database.py`, Ta5d6ff`maintenance.py` | (broadcasts on restore) | backup/restore skill tests | About / maintenance settings |
| Docs | Ta5d6ff`docs_manager.py` | Ta5d6ff`http/routes/docs.py` | (none) | docs manager tests | Ta5d6ff`docs/DocsPage.vue` |
| Sandbox | Ta5d6ff`landlock_sandbox.py`, Ta5d6ff`seccomp_sandbox.py` | Ta5d6ff`http/routes/status.py` | (none) | Ta5d6ff`test_landlock_sandbox.py`, Ta5d6ff`test_landlock_integration_surfaces.py`, sqlite landlock tests | Web exposure settings |
| RNS Link API | Ta5d6ff`rns_link_manager.py` | (WS only) | Ta5d6ff`http/ws/dispatch.py` | Ta5d6ff`test_rns_link_*` | plugins / external tools |
| Config | Ta5d6ff`config_manager.py` | Ta5d6ff`http/routes/config.py` | Ta5d6ff`http/ws/dispatch.py` | settings config services tests | Ta5d6ff`settings/SettingsPage.vue` |
Tc9d1d9## HTTP package layout
Ta5d6ff```
meshchatx/src/backend/http/
context.py
errors.py
live_names.py
middleware.py
register.py
routes/<domain>.py
routes/__init__.py
ws/dispatch.py
```
Ta5d6ff`register_all_routes(routes, app)` is the sole composition entry. Call it only from
Ta5d6ff`ReticulumMeshChat._define_routes`. Domain register functions are listed in fixed order
in Ta5d6ff`routes/__init__.py`. Free names resolve through Ta5d6ff`live_names.inject_meshchat_names`.
WS inbound handlers live in Ta5d6ff`ws/handlers_*.py` and are composed by Ta5d6ff`ws/dispatch.py`.
Tc9d1d9## Frontend mega-pages
Placement for extracts. Follow Ta5d6ff`docs/agents/skills/vue-mega-page-split/SKILL.md`.
Do not invent folders outside this table.
| Kind | Put it here | Example |
| --------------------------- | --------------------------------------------------- | ----------------------------------- |
| Page-private panel or UI | Ta5d6ff`components/<feature>/internal/*.vue` | MapSearchBar |
| Settings chunk | Ta5d6ff`components/settings/sections/*SettingsSection.vue` | TelephonySettingsSection |
| Pure logic | colocated Ta5d6ff`*.js` or Ta5d6ff`js/<feature>/` | clusterUtils, settingsConfigService |
| Cross-feature primitive | root Ta5d6ff`components/` or Ta5d6ff`components/forms/` | ConfirmDialog, Toggle |
| Nav, tools, commands wiring | Ta5d6ff`js/registries/` only | never grow App.vue for discovery |
| Page shell | On-disk child dirs | Planned child dirs | Shared JS | Primary tests |
| ------------------------------------------ | ------------------------------------------------------------------- | -------------------------------------------- | ------------------------------- | -------------------------------------------------------------------------------- |
| Ta5d6ff`settings/SettingsPage.vue` | Ta5d6ff`settings/sections/` (incl. Battery), toggle/block helpers | more sections from remaining inline template | Ta5d6ff`js/settings/` | Ta5d6ff`SettingsPage*.test.js`, Ta5d6ff`settingsSections.test.js`, Ta5d6ff`behaviorContracts.test.js` |
| Ta5d6ff`messages/ConversationViewer.vue` | Ta5d6ff`composer/`, Ta5d6ff`modals/`, Ta5d6ff`outbound/`, Ta5d6ff`lxmf/`, telemetry, helpers | further script slices | Ta5d6ff`conversationMessageHelpers.js` | ConversationViewer tests |
| Ta5d6ff`call/CallPage.vue` | Ta5d6ff`call/tabs/`, Ta5d6ff`call/audio/`, Ta5d6ff`CallOverlay.vue` | more tabs and audio panels | call helpers | Ta5d6ff`CallPage*.test.js` |
| Ta5d6ff`map/MapPage.vue` | Ta5d6ff`map/internal/` (panels + helpers, incl. MapSaveDrawingModal) | more overlays and modals into Ta5d6ff`internal/` | Ta5d6ff`js/map*` | map component tests |
| Ta5d6ff`relay/RelayChatPage.vue` | relay view components | further relay panels as needed | Ta5d6ff`js/relay*` | relay tests |
| Ta5d6ff`App.vue` | Ta5d6ff`layout/AppShellBanners.vue`, Ta5d6ff`layout/AppIdentitySwitchOverlay.vue` | more shell chrome under Ta5d6ff`layout/` | registries, WS shell | Ta5d6ff`AppIdentitySwitch.test.js` |
| Ta5d6ff`network-visualiser/NetworkVisualiser.vue` | Ta5d6ff`network-visualiser/internal/` | more chrome into Ta5d6ff`internal/` | Ta5d6ff`js/networkVisualiser*` | network visualiser tests |
| Ta5d6ff`interfaces/AddInterfacePage.vue` | Ta5d6ff`interfaces/internal/AddInterfaceDiscoveryPanel.vue` | further interface form panels | Ta5d6ff`js/interfaceDiscoveryUtils.js` | AddInterface tests |
Frontend ownership contracts:
Tff7b72- Ta5d6ff`tests/frontend/fixtures/frontend_mega_page_ownership.json`
Tff7b72- Ta5d6ff`tests/frontend/fixtures/frontend_symbol_continuity/`
Tff7b72- Ta5d6ff`tests/frontend/frontendOwnershipContract.test.js`
Tc9d1d9## Contract ownership
| Contract | Owner files |
| ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| HTTP route inventory | Ta5d6ff`tests/backend/fixtures/http_api_routes.json`, scanners in Ta5d6ff`http_api_contract_helpers.py` (reads Ta5d6ff`meshchat.py` and Ta5d6ff`backend/http/**/*.py`) |
| HTTP JSON GET schemas | Ta5d6ff`http_api_response_schemas.py`, Ta5d6ff`http_api_response_registry.py` |
| Core status/auth/app_info | Ta5d6ff`api_json_contract_schemas.py` |
| WS message manifest | Ta5d6ff`tests/backend/fixtures/ws_message_manifest.json`, Ta5d6ff`ws_contract_helpers.py` (reads Ta5d6ff`meshchat.py`, Ta5d6ff`backend/http/**/*.py`, Ta5d6ff`lifecycle/**`, Ta5d6ff`rns_link_manager.py`) |
Schema contracts stay in Ta5d6ff`tests/backend/`. Route and WS owners are production modules under Ta5d6ff`backend/http/`.
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────